#include "SeqQueue.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
// InitQueue: 分配并初始化一个队列：创建一个空顺序队列
struct SeqQueue*InitQueue(int num)
{
    struct SeqQueue*q = malloc(sizeof(*q));
    if(q == NULL)
        return NULL;
    q->capacity = num;
    q->data = malloc(sizeof(QElemType)*num);
    if(q->data == NULL)
    {
        free(q);
        return NULL;
    }
    q->front = q->rear = 0;//空队列

    return q;
}
// DestroyQueue: 销毁一个队列
bool DestroyQueue(struct SeqQueue*q)
{
    if(q == NULL)
        return false;
    if(q->data)
        free(q->data);
    q->data = NULL;
    free(q);
    q = NULL;
    return true;
}
// ClearQueue: 清空队列 -> 变成一个空队列
bool ClearQueue(struct SeqQueue*q)
{
    if(q == NULL)
        return false;
    q->front = q->rear = 0;//空队列

    return true;
}
// QueueIsEmpty: 判断一个队列是否为空
bool QueueIsEmpty(struct SeqQueue*q)
{
    if(q == NULL)
        return false;
    return q->front == q->rear ? true : false;
}
// QueueIsFull: 判断一个队列是否为满
bool QueueIsFull(struct SeqQueue*q)
{
     if(q == NULL)
        return false;
    return (q->rear+1)%q->capacity == q->front ? true : false;

    // if(q->rear+1 == q->capacity)
    // {
    //     if(0 == q->front)
    //     {
    //         return true;
    //     }

    // }
    // else
    // {
    //     if(q->rear+1 == q->front)
    //     {
    //         return true;
    //     }
    // }
    // return false;
}
// QueueLength: 返回队列中元素的个数，即队列的长度
int QueueLength(struct SeqQueue*q)
{
    if(q == NULL)
        return -1;
    if(q->rear >= q->front)
    {
        return q->rear-q->front;
    }
    else
    {
        return q->capacity-(q->front-q->rear);
    }
}
// EnQueue: 入队
bool EnQueue(struct SeqQueue*q, QElemType d)
{
    if(q == NULL || QueueIsFull(q))
    {
        return false;
    }
    *(q->data+q->rear) = d;

    q->rear++;
    q->rear %= q->capacity;

    return true;
}
// DeQueue: 出队
bool DeQueue(struct SeqQueue*q, QElemType* d)
{
    if(q == NULL || QueueIsEmpty(q))
    {
        return false;
    }

    if(d)
        *d = *(q->data+q->front);
    q->front++;
    q->front %= q->capacity;

    return true;
}
// GetHead: 获取队头的元素，但不出队。
bool GetHead(struct SeqQueue*q, QElemType* d)
{
    if(q == NULL || QueueIsEmpty(q))
    {
        return false;
    }

    if(d)
        *d = *(q->data+q->front);

    return true;
}